package br.mil.pamerj.efetivo.dao.impl;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Order;

import br.mil.pamerj.efetivo.dao.interfaces.IPaisDAO;
import br.mil.pamerj.efetivo.dao.util.HibernateUtil;
import br.mil.pamerj.efetivo.model.entity.Pais;

public class PaisDAOHibernate implements IPaisDAO {
    private Session session;
    private Transaction transaction;
    
    public void setSession(Session session){
     	
    	this.session = session;
    
    }
	
    public void create(Pais pais) {
    try{	
    	this.session = HibernateUtil.getSessionFactory().getCurrentSession();
    	this.transaction = this.session.beginTransaction();
		this.session.save(pais);
		this.transaction.commit();
    }catch(HibernateException e)
    {
     System.out.println("Não foi possível inserir o País. Erro: "+e.getMessage());	
    }finally
    {
    	try{
    		if (this.session.isOpen()){
    			this.session.close();
    		}
    	}catch(Throwable e){
    		System.out.println("Erro ao fechar operação de inserção: "+e.getMessage());
    	}
    }
	}

	public void update(Pais pais) {

	    try{	
	    	this.session = HibernateUtil.getSessionFactory().getCurrentSession();
	    	this.transaction = this.session.beginTransaction();
			this.session.update(pais);
			this.transaction.commit();
	    }catch(HibernateException e)
	    {
	     System.out.println("Não foi possível alterar o País. Erro: "+e.getMessage());	
	    }finally
	    {
	    	try{
	    		if (this.session.isOpen()){
	    			this.session.close();
	    		}
	    	}catch(Throwable e){
	    		System.out.println("Erro ao fechar operação de inserção: "+e.getMessage());
	    	}
	    }

		
	}

	public void remove(Pais pais) {

	    try{	
	    	this.session = HibernateUtil.getSessionFactory().getCurrentSession();
	    	this.transaction = this.session.beginTransaction();
			this.session.delete(pais);
			this.transaction.commit();
	    }catch(HibernateException e)
	    {
	     System.out.println("Não foi possível excluir o País. Erro: "+e.getMessage());	
	    }finally
	    {
	    	try{
	    		if (this.session.isOpen()){
	    			this.session.close();
	    		}
	    	}catch(Throwable e){
	    		System.out.println("Erro ao fechar operação de exclusão: "+e.getMessage());
	    	}
	    }

		
	}
	
	public Pais find(Long id) {
        Pais pais = null;
	    try{	
	    	this.session = HibernateUtil.getSessionFactory().getCurrentSession();
	    	this.transaction = this.session.beginTransaction();
	    	pais = (Pais)this.session.get(Pais.class, id);
	    	this.transaction.commit();
	    }catch(HibernateException e)
	    {
		    if (this.transaction.isActive()){
		    	this.transaction.rollback();
		    }
		    }finally
	    {
	    	try{
	    		if (this.session.isOpen()){
	    			this.session.close();
	    		}
	    	}catch(Throwable e){
	    		System.out.println("Erro ao fechar operação de busca: "+e.getMessage());
	    	}
	    }

		return pais; 
	}

	@SuppressWarnings("unchecked")
	public List<Pais> list() {
		List<Pais> paises =null;
		Criteria lista;
	    try{	
	    	this.session = HibernateUtil.getSessionFactory().getCurrentSession();
	    	this.transaction = this.session.beginTransaction();
	    	lista = this.session.createCriteria(Pais.class);
	    	lista.addOrder(Order.asc("descricao"));
	    	paises = lista.list();
	    	this.transaction.commit();
	    }catch(HibernateException e)
	    {
	    if (this.transaction.isActive()){
	    	this.transaction.rollback();
	    }	
	    }finally
	    {
	    	try{
	    		if (this.session.isOpen()){
	    			this.session.close();
	    		}
	    	}catch(Throwable e){
	    		System.out.println("Erro ao fechar operação de listagem: "+e.getMessage());
	    	}
	    }

		return paises;	
		
	}

}
